Bài 4-2 Abstract Class
1. Khái niệm
Abstract Class (Lớp trừu tượng) là một loại lớp trong Python mà:
- Không thể khởi tạo trực tiếp.
- Được dùng để định nghĩa giao diện (interface) cho các lớp con.
- Có thể chứa phương thức trừu tượng (chưa được cài đặt) và phương thức cụ thể (đã cài đặt).
Khi nào dùng Abstract Class?
- Khi bạn muốn tạo một khuôn mẫu chung cho các lớp con.
- Khi bạn muốn ép buộc các lớp con phải cài đặt một số phương thức nhất định.
2. Cách tạo lớp trừu tượng trong Python
Import các thành phần cần thiết:
from abc import ABC, abstractmethod
ABC: là lớp cơ sở để tạo lớp trừu tượng.@abstractmethod: decorator đánh dấu một phương thức là trừu tượng (phải được lớp con override).
3. Ví dụ cơ bản
from abc import ABC, abstractmethod
class Polygon(ABC):
def __init__(self, color):
self.color = color
@abstractmethod
def printSides(self):
pass
Giải thích:
Polygonlà lớp trừu tượng, kế thừa từABC.- Phương thức
printSideslà trừu tượng – không có thân hàm. - Không thể khởi tạo
Polygon()vì nó chưa đủ triển khai.
4. Lớp con cụ thể kế thừa và triển khai
class Triangle(Polygon):
def __init__(self, color):
super().__init__(color)
def printSides(self):
print("There are 3 sides")
b = Triangle("Red")
b.printSides()
Output:
There are 3 sides
Giải thích:
Trianglelà lớp cụ thể, kế thừa từPolygon.printSides()được override trong lớp con => OK.- Có thể khởi tạo và sử dụng bình thường.
5. Gây lỗi khi không override phương thức trừu tượng
class Triangle(Polygon):
def __init__(self, color):
super().__init__(color)
b = Triangle("Red") # Lỗi
Kết quả:
TypeError: Can't instantiate abstract class Triangle with abstract method printSides
Vì Triangle không triển khai printSides(), nên nó vẫn bị xem là lớp trừu tượng.
6. Lớp trừu tượng có thể chứa phương thức cụ thể
class Polygon(ABC):
def __init__(self, color):
self.color = color
@abstractmethod
def printSides(self):
pass
def printColor(self):
print(self.color)
class Triangle(Polygon):
def __init__(self, color):
super().__init__(color)
def printSides(self):
print("There are 3 sides")
b = Triangle("Red")
b.printSides()
b.printColor()
Output:
There are 3 sides
Red
Giải thích:
- Lớp
Polygoncó cả phương thức trừu tượng (printSides) và phương thức cụ thể (printColor). Trianglechỉ cần triển khai các phương thức trừu tượng, các phương thức cụ thể có thể dùng lại.
7. Tóm tắt kiến thức
| Đặc điểm | Mô tả |
|---|---|
| Không thể tạo instance | Bạn không thể gọi Polygon() nếu nó còn chứa abstract method |
| Bắt buộc override | Lớp con phải override tất cả các abstract method |
| Có thể chứa method cụ thể | Lớp trừu tượng vẫn có thể chứa các hàm đã cài đặt |
| Dùng abc.ABC | Tất cả lớp trừu tượng đều kế thừa từ ABC |
8. Kết luận
- Lớp trừu tượng là công cụ hữu ích giúp thiết kế hệ thống rõ ràng và dễ mở rộng.
- Trong Python, sử dụng
ABCvà@abstractmethodđể xây dựng trừu tượng. - Nếu lớp con không triển khai hết các abstract method, nó sẽ không thể khởi tạo.
- Lớp trừu tượng vẫn có thể chứa logic đã cài sẵn (concrete methods).